package com.zhou.kotlin_car_data_list.bean

import android.os.Parcelable
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize

/**
 * </br>
 * Date: 2025/8/24
 * Created by:zhourui
 */
data class LogoBean(
    @SerializedName("error_code")
    val error_code: Int,
    @SerializedName("reason")
    val reason: String,
    @SerializedName("result")
    val result: List<Brand>
)

//class Brand : BaseObservable() {
//    @SerializedName("brand_logo")
//    var brandLogo: String = ""
//        @Bindable get  // 用 @Bindable 标记自动生成的 getter
//
//    @SerializedName("brand_name")
//    var brandName: String = ""
//        @Bindable get
//
//    @SerializedName("first_letter")
//    var firstLetter: String = ""
//        @Bindable get
//
//    @SerializedName("id")
//    var id: String = ""
//        @Bindable get
//}


/*
   关于@SerializedName 和 @get:Bindable 两个注解，在当前代码中，不写也不会报错的原因是：
   1. @SerializedName 注解：
   作用：提供一个“映射指令”或“别名”。
   例如：@SerializedName("brand_name") val brandName: String,
   作用就是，将 JSON 中的 brand_name 字段映射到 brandName 属性，因此我们可以在代码中使用 brandName 属性来获取 brand_name 字段的值。
   @SerializedName 是 Gson 库的注解，用于JSON 字段与 Kotlin 类字段的映射，它的存在与否不影响类的定义，只影响 JSON 解析行为：
    如果不使用 Gson 解析 JSON：这个注解完全没用，不写自然不会报错（因为根本用不到）。
    如果使用 Gson 解析，但字段名与 JSON 键完全一致：Gson 会默认按 “字段名相同” 进行映射，此时不写 @SerializedName 也能正常解析，所以不报错。
    什么时候会报错？
    只有当字段名与 JSON 键不一致，且没写 @SerializedName 时，Gson 解析才会失败（字段值为 null），但这是运行时错误（解析后数据不对），而非编译时错误，所以代码编译阶段不会报错

    2. @get:Bindable 注解：来自 Android Data Binding 库的注解，用于标记可观察字段。
    作用是：当字段的值变化时，通知 Data Binding 框架更新 UI。需要配合 BaseObservable 使用，且字段的 getter 方法会被 Data Binding 监听。
    如果不使用 Data Binding 绑定该字段：这个注解没用，不写不会报错。
    如果使用 Data Binding，但不需要监听字段变化：即使不写 @get:Bindable，也能通过 Data Binding 显示字段的初始值（只是字段变化时 UI 不会更新），因此不会报错。
    什么时候会报错？
    只有当你既使用了 @get:Bindable，又没让类继承 BaseObservable 或实现 Observable 接口时，才会在编译阶段报错（如之前的 Bindable must be on a member in an Observable class 错误）。
    而如果完全不写 @get:Bindable，即使类继承了 BaseObservable，也不会报错（只是字段不具备 “可观察” 能力）。

    3. @Parcelize 注解：
    @Parcelize 是 Kotlin 官方提供的一个注解（属于 kotlin-parcelize 插件），用于自动生成 Parcelable 接口的实现代码，极大简化了 Android 开发中对象序列化的过程。
    核心作用
    在 Android 中，Parcelable 是一种高效的对象序列化方式，常用于组件间（如 Activity、Fragment 之间）通过 Intent 传递数据。但手动实现 Parcelable 需要重写多个方法（如 writeToParcel()、createFromParcel() 等），代码繁琐且易出错。
    @Parcelize 的出现解决了这个问题：只需给类添加 @Parcelize 注解，并让类实现 Parcelable 接口，Kotlin 编译器会在编译时自动生成所有必要的序列化 / 反序列化代码，无需手动编写。
 */


@Parcelize
data class Brand(
    @SerializedName("brand_logo")
    @get:Bindable
    val brand_logo: String,
    @SerializedName("brand_name")
    @get:Bindable
    val brandName: String,
    @SerializedName("first_letter")
    @get:Bindable
    val first_letter: String,
    @SerializedName("id")
    @get:Bindable
    val id: String
) : BaseObservable(), Parcelable